# filepath: d:\CompanyProject\Gitee\DBCompareX\backend\app\models\task_data_sync\data_comparison.py
"""
数据比较模块，负责对比目标和源数据，并生成比较结果
"""
from typing import List, Dict, Any, Tuple
from bson import ObjectId
import logging

from ...database.mongodb import task_ts_contrast_result_collection
from .data_utils import DataUtils

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class DataComparison:
    """数据比较工具类，提供数据对比功能"""
    
    contrast_result_collection = task_ts_contrast_result_collection
    
    @classmethod
    async def compare_data(cls, task_setting: Dict[str, Any], execution_log_id: str, 
                          target_data: List[Dict[str, Any]], source_data: List[Dict[str, Any]]) -> Tuple[List[Dict[str, Any]], int]:
        """
        对比目标数据和源数据，并记录结果
        
        Args:
            task_setting: 数据同步任务配置
            execution_log_id: 执行日志ID
            target_data: 目标数据列表
            source_data: 源数据列表
            
        Returns:
            对比结果列表和不同数据项数量
        """
        contrast_results = []
        different_count = 0
        
        # 获取需要对比的列
        columns = [detail["column_name"] for detail in task_setting["details"]]
        
        logger.info(f"开始对比数据, 列数: {len(columns)}")
        
        # 创建目标数据ID到目标数据的映射，以便根据源数据中的task_target_list_id快速查找目标数据
        target_data_map = {item["_id"]: item for item in target_data}
        
        # 遍历源数据，并与对应的目标数据进行比对
        for source_item in source_data:
            source_item_id = source_item["_id"]
            target_item_id = source_item["task_target_list_id"]
            
            # 获取对应的目标数据
            target_item = target_data_map.get(target_item_id)
            
            if not target_item:
                logger.warning(f"源数据ID: {source_item_id} 对应的目标数据ID: {target_item_id} 未找到")
                continue
            
            # 遍历每一列进行对比
            for column in columns:
                target_value = target_item["data"].get(column)
                source_value = source_item["data"].get(column)
                
                # 检查值是否相同
                is_same = DataUtils.compare_values(target_value, source_value)
                
                # 处理特殊类型数据
                target_value = DataUtils.handle_special_types(target_value)
                source_value = DataUtils.handle_special_types(source_value)
                
                # 创建对比结果记录
                result = {
                    "task_data_sync_execution_log_id": execution_log_id,
                    "task_target_list_id": target_item_id,
                    "task_source_list_id": source_item_id,
                    "column_name": column,
                    "target_data": target_value,
                    "source_data": source_value,
                    "is_same": is_same
                }
                
                # 保存对比结果
                insert_result = await cls.contrast_result_collection.insert_one(result)
                result["_id"] = str(insert_result.inserted_id)
                contrast_results.append(result)
                
                # 统计不同数据项
                if not is_same:
                    different_count += 1
                    logger.debug(f"列 {column} 数据不同: 目标={target_value}, 源={source_value}")
        
        logger.info(f"数据对比完成, 总数据项: {len(contrast_results)}, 不同数据项: {different_count}")
        return contrast_results, different_count